/**
 * 给定两个二叉树，想象当你将它们中的一个覆盖到另一个上时，两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠，那么将他们的值相加作为节点合并后的新值，否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

输入: 
	Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
输出: 
合并后的树:
	     3
	    / \
	   4   5
	  / \   \ 
	 5   4   7
注意: 合并必须从两个树的根节点开始。
 */

import { TreeNode } from "../dataClass";

(function () {
    /**
     * Definition for a binary tree node.
     * class TreeNode {
     *     val: number
     *     left: TreeNode | null
     *     right: TreeNode | null
     *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
     *         this.val = (val===undefined ? 0 : val)
     *         this.left = (left===undefined ? null : left)
     *         this.right = (right===undefined ? null : right)
     *     }
     * }
     */

    function mergeTrees(
        root1: TreeNode | null,
        root2: TreeNode | null
    ): TreeNode | null {
        // 树1当前节点为空则直接添加树2
        if (root1 === null) {
            return root2;
        }
        // 树2当前节点为空则直接添加树1
        if (root2 === null) {
            return root1;
        }

        // 合并值
        root1.val += root2.val;
        // 遍历树1，树2的左节点，将左节点的结果作为树1的左节点！
        root1.left = mergeTrees(root1.left, root2.left);
        // 遍历树1，树2的右节点，将右节点的结果作为树1的右节点！
        root1.right = mergeTrees(root1.right, root2.right);

        return root1;
    }
})();
